package com.ccnode.codegenerator.taikaoback.util;

import java.util.HashMap;
import java.util.Map;

/**
 * ThreadLocal 工具类
 * 用于管理当前线程的用户会话信息
 */
@SuppressWarnings("all")
public class UserContext {

    // 提供ThreadLocal对象，存储用户会话信息
    private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new ThreadLocal<>();

    // 用户ID键名
    private static final String USER_ID_KEY = "userId";
    // 用户名键名
    private static final String USERNAME_KEY = "username";

    /**
     * 获取当前线程的用户会话Map
     */
    private static Map<String, Object> getSessionMap() {
        Map<String, Object> sessionMap = THREAD_LOCAL.get();
        if (sessionMap == null) {
            sessionMap = new HashMap<>();
            THREAD_LOCAL.set(sessionMap);
        }
        return sessionMap;
    }

    /**
     * 设置当前用户信息
     * @param userId 用户ID
     * @param username 用户名
     */
    public static void setCurrentUser(Long userId, String username) {
        Map<String, Object> sessionMap = getSessionMap();
        sessionMap.put(USER_ID_KEY, userId);
        sessionMap.put(USERNAME_KEY, username);
    }

    /**
     * 获取当前用户ID
     * @return 用户ID
     */
    public static Long getCurrentUserId() {
        Map<String, Object> sessionMap = THREAD_LOCAL.get();
        if (sessionMap != null) {
            return (Long) sessionMap.get(USER_ID_KEY);
        }
        return null;
    }

    /**
     * 获取当前用户名
     * @return 用户名
     */
    public static String getCurrentUsername() {
        Map<String, Object> sessionMap = THREAD_LOCAL.get();
        if (sessionMap != null) {
            return (String) sessionMap.get(USERNAME_KEY);
        }
        return null;
    }

    /**
     * 根据键获取值（兼容旧版本）
     */
    public static <T> T get() {
        return (T) THREAD_LOCAL.get();
    }

    /**
     * 根据键获取指定值
     * @param key 键名
     * @return 值
     */
    public static <T> T get(String key) {
        Map<String, Object> sessionMap = THREAD_LOCAL.get();
        if (sessionMap != null) {
            return (T) sessionMap.get(key);
        }
        return null;
    }

    /**
     * 存储键值对（兼容旧版本）
     */
    public static void set(Object value) {
        if (value instanceof Map) {
            THREAD_LOCAL.set((Map<String, Object>) value);
        } else {
            // 如果不是Map，创建新的Map并存储
            Map<String, Object> sessionMap = new HashMap<>();
            sessionMap.put("data", value);
            THREAD_LOCAL.set(sessionMap);
        }
    }

    /**
     * 存储指定键值对
     * @param key 键名
     * @param value 值
     */
    public static void set(String key, Object value) {
        Map<String, Object> sessionMap = getSessionMap();
        sessionMap.put(key, value);
    }

    /**
     * 清除ThreadLocal 防止内存泄漏
     */
    public static void remove() {
        THREAD_LOCAL.remove();
    }

    /**
     * 检查当前是否有用户登录
     * @return true-已登录，false-未登录
     */
    public static boolean hasCurrentUser() {
        return getCurrentUserId() != null && getCurrentUsername() != null;
    }
    
}
